using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Globalization;
using System.Linq.Expressions;
using System.Numerics;
using ns20;

namespace Newtonsoft.Json.Linq
{
	public class JValue : JToken, IEquatable<JValue>, IComparable<JValue>, IFormattable, IComparable, IConvertible
	{
		private class Class87 : Class86<JValue>
		{
			public override bool ns20_002EClass86_003CNewtonsoft_002EJson_002ELinq_002EJValue_003E_002E_200F_202A_206D_206D_200E_202A_202A_202A_202A_200E_202D_202C_206A_206A_200F_206F_200F_202C_202C_200E_206F_202E_202D_202D_206E_202E_206A_206A_200D_206F_202B_202A_202B_206C_206F_200C_200F_200B_202E_206F_202E(JValue jvalue_0, ConvertBinder convertBinder_0, out object object_0)
			{
				if (convertBinder_0.Type == typeof(JValue))
				{
					object_0 = jvalue_0;
					return true;
				}
				object value = jvalue_0.Value;
				if (value == null)
				{
					object_0 = null;
					return Class195.smethod_9(convertBinder_0.Type);
				}
				object_0 = Class182.smethod_8(jvalue_0.Value, CultureInfo.InvariantCulture, convertBinder_0.Type);
				return true;
			}

			public override bool ns20_002EClass86_003CNewtonsoft_002EJson_002ELinq_002EJValue_003E_002E_200C_202E_200C_202D_200D_206F_202B_206A_202D_206F_200D_200C_202E_202B_206B_206B_206F_206C_206E_202E_206A_206F_200B_200D_200E_200B_200E_206F_202E_202A_206E_202D_200B_202B_200D_200E_206F_206E_206E_202B_202E(JValue jvalue_0, BinaryOperationBinder binaryOperationBinder_0, object object_0, out object object_1)
			{
				object object_2 = ((object_0 is JValue) ? ((JValue)object_0).Value : object_0);
				switch (binaryOperationBinder_0.Operation)
				{
				case ExpressionType.Equal:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) == 0;
					return true;
				case ExpressionType.GreaterThan:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) > 0;
					return true;
				case ExpressionType.GreaterThanOrEqual:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) >= 0;
					return true;
				case ExpressionType.LessThan:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) < 0;
					return true;
				case ExpressionType.LessThanOrEqual:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) <= 0;
					return true;
				case ExpressionType.NotEqual:
					object_1 = smethod_7(jvalue_0.Type, jvalue_0.Value, object_2) != 0;
					return true;
				case ExpressionType.Add:
				case ExpressionType.Divide:
				case ExpressionType.Multiply:
				case ExpressionType.Subtract:
				case ExpressionType.AddAssign:
				case ExpressionType.DivideAssign:
				case ExpressionType.MultiplyAssign:
				case ExpressionType.SubtractAssign:
					if (smethod_9(binaryOperationBinder_0.Operation, jvalue_0.Value, object_2, out object_1))
					{
						object_1 = new JValue(object_1);
						return true;
					}
					break;
				}
				object_1 = null;
				return false;
			}
		}

		private JTokenType jtokenType_10;

		private object object_0;

		public override bool HasValues => false;

		public override JTokenType Type => jtokenType_10;

		public new object Value
		{
			get
			{
				return object_0;
			}
			set
			{
				Type type = ((object_0 != null) ? object_0.GetType() : null);
				Type type2 = value?.GetType();
				if (type != type2)
				{
					jtokenType_10 = smethod_10(jtokenType_10, value);
				}
				object_0 = value;
			}
		}

		internal JValue(object value, JTokenType type)
		{
			object_0 = value;
			jtokenType_10 = type;
		}

		public JValue(JValue other)
			: this(other.Value, other.Type)
		{
		}

		public JValue(long value)
			: this(value, JTokenType.Integer)
		{
		}

		public JValue(char value)
			: this(value, JTokenType.String)
		{
		}

		[CLSCompliant(false)]
		public JValue(ulong value)
			: this(value, JTokenType.Integer)
		{
		}

		public JValue(double value)
			: this(value, JTokenType.Float)
		{
		}

		public JValue(float value)
			: this(value, JTokenType.Float)
		{
		}

		public JValue(DateTime value)
			: this(value, JTokenType.Date)
		{
		}

		public JValue(bool value)
			: this(value, JTokenType.Boolean)
		{
		}

		public JValue(string value)
			: this(value, JTokenType.String)
		{
		}

		public JValue(Guid value)
			: this(value, JTokenType.Guid)
		{
		}

		public JValue(Uri value)
			: this(value, (value != null) ? JTokenType.Uri : JTokenType.Null)
		{
		}

		public JValue(TimeSpan value)
			: this(value, JTokenType.TimeSpan)
		{
		}

		public JValue(object value)
			: this(value, smethod_10(null, value))
		{
		}

		internal override bool Newtonsoft_002EJson_002ELinq_002EJToken_002E_206F_200C_206F_206F_206B_200E_206C_206B_200C_200D_202E_200E_200E_200D_202C_200D_200C_206B_200F_202D_202E_200F_200C_202D_206B_200D_206B_206E_202E_206E_202B_206D_206E_206F_202C_202E_200D_200C_200D_200F_202E(JToken jtoken_2)
		{
			JValue jValue = jtoken_2 as JValue;
			if (jValue == null)
			{
				return false;
			}
			if (jValue == this)
			{
				return true;
			}
			return smethod_12(this, jValue);
		}

		private static int smethod_6(BigInteger bigInteger_0, object object_1)
		{
			int num = bigInteger_0.CompareTo(Class182.smethod_6(object_1));
			if (num != 0)
			{
				return num;
			}
			if (object_1 is decimal)
			{
				decimal num2 = (decimal)object_1;
				return 0m.CompareTo(Math.Abs(num2 - Math.Truncate(num2)));
			}
			if (!(object_1 is double) && !(object_1 is float))
			{
				return num;
			}
			double num3 = Convert.ToDouble(object_1, CultureInfo.InvariantCulture);
			return 0.0.CompareTo(Math.Abs(num3 - Math.Truncate(num3)));
		}

		internal static int smethod_7(JTokenType jtokenType_11, object object_1, object object_2)
		{
			if (object_1 == null && object_2 == null)
			{
				return 0;
			}
			if (object_1 != null && object_2 == null)
			{
				return 1;
			}
			if (object_1 == null && object_2 != null)
			{
				return -1;
			}
			switch (jtokenType_11)
			{
			case JTokenType.Integer:
				if (object_1 is BigInteger)
				{
					return smethod_6((BigInteger)object_1, object_2);
				}
				if (object_2 is BigInteger)
				{
					return -smethod_6((BigInteger)object_2, object_1);
				}
				if (!(object_1 is ulong) && !(object_2 is ulong) && !(object_1 is decimal) && !(object_2 is decimal))
				{
					if (!(object_1 is float) && !(object_2 is float) && !(object_1 is double) && !(object_2 is double))
					{
						return Convert.ToInt64(object_1, CultureInfo.InvariantCulture).CompareTo(Convert.ToInt64(object_2, CultureInfo.InvariantCulture));
					}
					return smethod_8(object_1, object_2);
				}
				return Convert.ToDecimal(object_1, CultureInfo.InvariantCulture).CompareTo(Convert.ToDecimal(object_2, CultureInfo.InvariantCulture));
			case JTokenType.Float:
				if (object_1 is BigInteger)
				{
					return smethod_6((BigInteger)object_1, object_2);
				}
				if (object_2 is BigInteger)
				{
					return -smethod_6((BigInteger)object_2, object_1);
				}
				return smethod_8(object_1, object_2);
			case JTokenType.Boolean:
			{
				bool flag = Convert.ToBoolean(object_1, CultureInfo.InvariantCulture);
				bool value3 = Convert.ToBoolean(object_2, CultureInfo.InvariantCulture);
				return flag.CompareTo(value3);
			}
			default:
				throw Class194.smethod_1("valueType", jtokenType_11, "Unexpected value type: {0}".smethod_0(CultureInfo.InvariantCulture, jtokenType_11));
			case JTokenType.Date:
			{
				if (object_1 is DateTime)
				{
					DateTime dateTime = (DateTime)object_1;
					DateTime value2 = ((!(object_2 is DateTimeOffset)) ? Convert.ToDateTime(object_2, CultureInfo.InvariantCulture) : ((DateTimeOffset)object_2).DateTime);
					return dateTime.CompareTo(value2);
				}
				DateTimeOffset dateTimeOffset = (DateTimeOffset)object_1;
				DateTimeOffset other = ((!(object_2 is DateTimeOffset)) ? new DateTimeOffset(Convert.ToDateTime(object_2, CultureInfo.InvariantCulture)) : ((DateTimeOffset)object_2));
				return dateTimeOffset.CompareTo(other);
			}
			case JTokenType.Comment:
			case JTokenType.String:
			case JTokenType.Raw:
			{
				string strA = Convert.ToString(object_1, CultureInfo.InvariantCulture);
				string strB = Convert.ToString(object_2, CultureInfo.InvariantCulture);
				return string.CompareOrdinal(strA, strB);
			}
			case JTokenType.Bytes:
			{
				if (!(object_2 is byte[]))
				{
					throw new ArgumentException("Object must be of type byte[].");
				}
				byte[] array = object_1 as byte[];
				byte[] array2 = object_2 as byte[];
				if (array == null)
				{
					return -1;
				}
				if (array2 == null)
				{
					return 1;
				}
				return Class194.smethod_3(array, array2);
			}
			case JTokenType.Guid:
			{
				if (!(object_2 is Guid))
				{
					throw new ArgumentException("Object must be of type Guid.");
				}
				Guid guid = (Guid)object_1;
				Guid value4 = (Guid)object_2;
				return guid.CompareTo(value4);
			}
			case JTokenType.Uri:
			{
				if (!(object_2 is Uri))
				{
					throw new ArgumentException("Object must be of type Uri.");
				}
				Uri uri = (Uri)object_1;
				Uri uri2 = (Uri)object_2;
				return Comparer<string>.Default.Compare(uri.ToString(), uri2.ToString());
			}
			case JTokenType.TimeSpan:
			{
				if (!(object_2 is TimeSpan))
				{
					throw new ArgumentException("Object must be of type TimeSpan.");
				}
				TimeSpan timeSpan = (TimeSpan)object_1;
				TimeSpan value = (TimeSpan)object_2;
				return timeSpan.CompareTo(value);
			}
			}
		}

		private static int smethod_8(object object_1, object object_2)
		{
			double double_ = Convert.ToDouble(object_1, CultureInfo.InvariantCulture);
			double num = Convert.ToDouble(object_2, CultureInfo.InvariantCulture);
			if (Class193.smethod_5(double_, num))
			{
				return 0;
			}
			return double_.CompareTo(num);
		}

		private static bool smethod_9(ExpressionType expressionType_0, object object_1, object object_2, out object object_3)
		{
			if ((!(object_1 is string) && !(object_2 is string)) || (expressionType_0 != 0 && expressionType_0 != ExpressionType.AddAssign))
			{
				if (!(object_1 is BigInteger) && !(object_2 is BigInteger))
				{
					if (!(object_1 is ulong) && !(object_2 is ulong) && !(object_1 is decimal) && !(object_2 is decimal))
					{
						if (!(object_1 is float) && !(object_2 is float) && !(object_1 is double) && !(object_2 is double))
						{
							if (object_1 is int || object_1 is uint || object_1 is long || object_1 is short || object_1 is ushort || object_1 is sbyte || object_1 is byte || object_2 is int || object_2 is uint || object_2 is long || object_2 is short || object_2 is ushort || object_2 is sbyte || object_2 is byte)
							{
								if (object_1 == null || object_2 == null)
								{
									object_3 = null;
									return true;
								}
								long num = Convert.ToInt64(object_1, CultureInfo.InvariantCulture);
								long num2 = Convert.ToInt64(object_2, CultureInfo.InvariantCulture);
								switch (expressionType_0)
								{
								case ExpressionType.Add:
								case ExpressionType.AddAssign:
									object_3 = num + num2;
									return true;
								case ExpressionType.Divide:
								case ExpressionType.DivideAssign:
									object_3 = num / num2;
									return true;
								case ExpressionType.Subtract:
								case ExpressionType.SubtractAssign:
									object_3 = num - num2;
									return true;
								case ExpressionType.Multiply:
								case ExpressionType.MultiplyAssign:
									object_3 = num * num2;
									return true;
								}
							}
						}
						else
						{
							if (object_1 == null || object_2 == null)
							{
								object_3 = null;
								return true;
							}
							double num3 = Convert.ToDouble(object_1, CultureInfo.InvariantCulture);
							double num4 = Convert.ToDouble(object_2, CultureInfo.InvariantCulture);
							switch (expressionType_0)
							{
							case ExpressionType.Add:
							case ExpressionType.AddAssign:
								object_3 = num3 + num4;
								return true;
							case ExpressionType.Divide:
							case ExpressionType.DivideAssign:
								object_3 = num3 / num4;
								return true;
							case ExpressionType.Subtract:
							case ExpressionType.SubtractAssign:
								object_3 = num3 - num4;
								return true;
							case ExpressionType.Multiply:
							case ExpressionType.MultiplyAssign:
								object_3 = num3 * num4;
								return true;
							}
						}
					}
					else
					{
						if (object_1 == null || object_2 == null)
						{
							object_3 = null;
							return true;
						}
						decimal num5 = Convert.ToDecimal(object_1, CultureInfo.InvariantCulture);
						decimal num6 = Convert.ToDecimal(object_2, CultureInfo.InvariantCulture);
						switch (expressionType_0)
						{
						case ExpressionType.Add:
						case ExpressionType.AddAssign:
							object_3 = num5 + num6;
							return true;
						case ExpressionType.Divide:
						case ExpressionType.DivideAssign:
							object_3 = num5 / num6;
							return true;
						case ExpressionType.Subtract:
						case ExpressionType.SubtractAssign:
							object_3 = num5 - num6;
							return true;
						case ExpressionType.Multiply:
						case ExpressionType.MultiplyAssign:
							object_3 = num5 * num6;
							return true;
						}
					}
				}
				else
				{
					if (object_1 == null || object_2 == null)
					{
						object_3 = null;
						return true;
					}
					BigInteger bigInteger = Class182.smethod_6(object_1);
					BigInteger bigInteger2 = Class182.smethod_6(object_2);
					switch (expressionType_0)
					{
					case ExpressionType.Add:
					case ExpressionType.AddAssign:
						object_3 = bigInteger + bigInteger2;
						return true;
					case ExpressionType.Divide:
					case ExpressionType.DivideAssign:
						object_3 = bigInteger / bigInteger2;
						return true;
					case ExpressionType.Subtract:
					case ExpressionType.SubtractAssign:
						object_3 = bigInteger - bigInteger2;
						return true;
					case ExpressionType.Multiply:
					case ExpressionType.MultiplyAssign:
						object_3 = bigInteger * bigInteger2;
						return true;
					}
				}
				object_3 = null;
				return false;
			}
			object_3 = object_1?.ToString() + object_2;
			return true;
		}

		internal override JToken Newtonsoft_002EJson_002ELinq_002EJToken_002E_206F_206A_202E_200B_200D_206A_200C_200E_206A_202D_200E_206E_206F_200B_206C_200F_200C_200C_202A_206B_200C_202D_200B_202B_202A_202D_202B_206A_206F_206F_202D_200C_206F_202E_206B_200D_206C_202D_202E_200E_202E()
		{
			return new JValue(this);
		}

		public static JValue CreateComment(string value)
		{
			return new JValue(value, JTokenType.Comment);
		}

		public static JValue CreateString(string value)
		{
			return new JValue(value, JTokenType.String);
		}

		private static JTokenType smethod_10(JTokenType? nullable_2, object object_1)
		{
			if (object_1 == null)
			{
				return JTokenType.Null;
			}
			if (object_1 == DBNull.Value)
			{
				return JTokenType.Null;
			}
			if (object_1 is string)
			{
				return smethod_11(nullable_2);
			}
			if (!(object_1 is long) && !(object_1 is int) && !(object_1 is short) && !(object_1 is sbyte) && !(object_1 is ulong) && !(object_1 is uint) && !(object_1 is ushort) && !(object_1 is byte))
			{
				if (object_1 is Enum)
				{
					return JTokenType.Integer;
				}
				if (object_1 is BigInteger)
				{
					return JTokenType.Integer;
				}
				if (!(object_1 is double) && !(object_1 is float) && !(object_1 is decimal))
				{
					if (object_1 is DateTime)
					{
						return JTokenType.Date;
					}
					if (object_1 is DateTimeOffset)
					{
						return JTokenType.Date;
					}
					if (object_1 is byte[])
					{
						return JTokenType.Bytes;
					}
					if (object_1 is bool)
					{
						return JTokenType.Boolean;
					}
					if (object_1 is Guid)
					{
						return JTokenType.Guid;
					}
					if (object_1 is Uri)
					{
						return JTokenType.Uri;
					}
					if (object_1 is TimeSpan)
					{
						return JTokenType.TimeSpan;
					}
					throw new ArgumentException("Could not determine JSON object type for type {0}.".smethod_0(CultureInfo.InvariantCulture, object_1.GetType()));
				}
				return JTokenType.Float;
			}
			return JTokenType.Integer;
		}

		private static JTokenType smethod_11(JTokenType? nullable_2)
		{
			if (!nullable_2.HasValue)
			{
				return JTokenType.String;
			}
			JTokenType value = nullable_2.Value;
			if (value != JTokenType.Comment && value != JTokenType.String && value != JTokenType.Raw)
			{
				return JTokenType.String;
			}
			return nullable_2.Value;
		}

		public override void WriteTo(JsonWriter writer, params JsonConverter[] converters)
		{
			if (converters != null && converters.Length > 0 && object_0 != null)
			{
				JsonConverter jsonConverter = JsonSerializer.smethod_1(converters, object_0.GetType());
				if (jsonConverter != null)
				{
					jsonConverter.WriteJson(writer, object_0, JsonSerializer.CreateDefault());
					return;
				}
			}
			switch (jtokenType_10)
			{
			default:
				throw Class194.smethod_1("TokenType", jtokenType_10, "Unexpected token type.");
			case JTokenType.Comment:
				writer.WriteComment((object_0 != null) ? object_0.ToString() : null);
				break;
			case JTokenType.Integer:
				if (object_0 is BigInteger)
				{
					writer.WriteValue((BigInteger)object_0);
				}
				else
				{
					writer.WriteValue(Convert.ToInt64(object_0, CultureInfo.InvariantCulture));
				}
				break;
			case JTokenType.Float:
				if (object_0 is decimal)
				{
					writer.WriteValue((decimal)object_0);
				}
				else if (object_0 is double)
				{
					writer.WriteValue((double)object_0);
				}
				else if (object_0 is float)
				{
					writer.WriteValue((float)object_0);
				}
				else
				{
					writer.WriteValue(Convert.ToDouble(object_0, CultureInfo.InvariantCulture));
				}
				break;
			case JTokenType.String:
				writer.WriteValue((object_0 != null) ? object_0.ToString() : null);
				break;
			case JTokenType.Boolean:
				writer.WriteValue(Convert.ToBoolean(object_0, CultureInfo.InvariantCulture));
				break;
			case JTokenType.Null:
				writer.WriteNull();
				break;
			case JTokenType.Undefined:
				writer.WriteUndefined();
				break;
			case JTokenType.Date:
				if (object_0 is DateTimeOffset)
				{
					writer.WriteValue((DateTimeOffset)object_0);
				}
				else
				{
					writer.WriteValue(Convert.ToDateTime(object_0, CultureInfo.InvariantCulture));
				}
				break;
			case JTokenType.Raw:
				writer.WriteRawValue((object_0 != null) ? object_0.ToString() : null);
				break;
			case JTokenType.Bytes:
				writer.WriteValue((byte[])object_0);
				break;
			case JTokenType.Guid:
			case JTokenType.Uri:
			case JTokenType.TimeSpan:
				writer.WriteValue((object_0 != null) ? object_0.ToString() : null);
				break;
			}
		}

		internal override int Newtonsoft_002EJson_002ELinq_002EJToken_002E_200C_202A_206D_200B_206C_206F_202A_200F_200E_206E_200D_202D_200B_200D_206E_202D_206E_200D_202E_206B_206F_206F_202B_206D_206D_202E_206C_200F_202D_202A_206B_206B_200D_202A_200C_202D_200F_202A_206F_200F_202E()
		{
			int num = ((object_0 != null) ? object_0.GetHashCode() : 0);
			return jtokenType_10.GetHashCode() ^ num;
		}

		private static bool smethod_12(JValue jvalue_0, JValue jvalue_1)
		{
			if (jvalue_0 != jvalue_1)
			{
				if (jvalue_0.jtokenType_10 == jvalue_1.jtokenType_10)
				{
					return smethod_7(jvalue_0.jtokenType_10, jvalue_0.object_0, jvalue_1.object_0) == 0;
				}
				return false;
			}
			return true;
		}

		public bool Equals(JValue other)
		{
			if (other == null)
			{
				return false;
			}
			return smethod_12(this, other);
		}

		public override bool Equals(object obj)
		{
			if (obj == null)
			{
				return false;
			}
			JValue jValue = obj as JValue;
			if (jValue != null)
			{
				return Equals(jValue);
			}
			return base.Equals(obj);
		}

		public override int GetHashCode()
		{
			if (object_0 == null)
			{
				return 0;
			}
			return object_0.GetHashCode();
		}

		public override string ToString()
		{
			if (object_0 == null)
			{
				return string.Empty;
			}
			return object_0.ToString();
		}

		public string ToString(string format)
		{
			return ToString(format, CultureInfo.CurrentCulture);
		}

		public string ToString(IFormatProvider formatProvider)
		{
			return ToString(null, formatProvider);
		}

		public string ToString(string format, IFormatProvider formatProvider)
		{
			if (object_0 == null)
			{
				return string.Empty;
			}
			IFormattable formattable = object_0 as IFormattable;
			if (formattable != null)
			{
				return formattable.ToString(format, formatProvider);
			}
			return object_0.ToString();
		}

		protected override DynamicMetaObject GetMetaObject(Expression parameter)
		{
			return new Class144<JValue>(parameter, this, new Class87(), dontFallbackFirst: true);
		}

		int IComparable.CompareTo(object obj)
		{
			if (obj == null)
			{
				return 1;
			}
			object object_ = ((obj is JValue) ? ((JValue)obj).Value : obj);
			return smethod_7(jtokenType_10, object_0, object_);
		}

		public int CompareTo(JValue obj)
		{
			if (obj == null)
			{
				return 1;
			}
			return smethod_7(jtokenType_10, object_0, obj.object_0);
		}

		TypeCode IConvertible.GetTypeCode()
		{
			if (object_0 == null)
			{
				return TypeCode.Empty;
			}
			if (object_0 is DateTimeOffset)
			{
				return TypeCode.DateTime;
			}
			if (object_0 is BigInteger)
			{
				return TypeCode.Object;
			}
			return System.Type.GetTypeCode(object_0.GetType());
		}

		bool IConvertible.ToBoolean(IFormatProvider provider)
		{
			return (bool)(JToken)this;
		}

		char IConvertible.ToChar(IFormatProvider provider)
		{
			return (char)(JToken)this;
		}

		sbyte IConvertible.ToSByte(IFormatProvider provider)
		{
			return (sbyte)(short)(JToken)this;
		}

		byte IConvertible.ToByte(IFormatProvider provider)
		{
			return (byte)(JToken)this;
		}

		short IConvertible.ToInt16(IFormatProvider provider)
		{
			return (short)(JToken)this;
		}

		ushort IConvertible.ToUInt16(IFormatProvider provider)
		{
			return (ushort)(JToken)this;
		}

		int IConvertible.ToInt32(IFormatProvider provider)
		{
			return (int)(JToken)this;
		}

		uint IConvertible.ToUInt32(IFormatProvider provider)
		{
			return (uint)(JToken)this;
		}

		long IConvertible.ToInt64(IFormatProvider provider)
		{
			return (long)(JToken)this;
		}

		ulong IConvertible.ToUInt64(IFormatProvider provider)
		{
			return (ulong)(JToken)this;
		}

		float IConvertible.ToSingle(IFormatProvider provider)
		{
			return (float)(JToken)this;
		}

		double IConvertible.ToDouble(IFormatProvider provider)
		{
			return (double)(JToken)this;
		}

		decimal IConvertible.ToDecimal(IFormatProvider provider)
		{
			return (decimal)(JToken)this;
		}

		DateTime IConvertible.ToDateTime(IFormatProvider provider)
		{
			return (DateTime)(JToken)this;
		}

		object IConvertible.ToType(Type conversionType, IFormatProvider provider)
		{
			return ToObject(conversionType);
		}
	}
}
